383. 赎金信
383. 赎金信
分析
这个题跟 242. 有效的字母异位词 如出一辙,都是通过将字符转化为 ASCII 作为哈希函数来进行从字符到数字的映射,然后在数组对应的位置保存字符出现的次数,key 为字符,value 为字符出现的次数,而且题目中也提示了字符串都是小写字母,因此哈希的结果用一个长度为 26 的 int 数组即可。
然后题目的意思是,magazine
中的每个字符只能在 ransomNote
中使用一次。也就是说,ransomNote 的字符个数,得小于等于 magazine 中的字符个数,很容易想到思路:先统计 magazine 中的字符个数,然后再用减去对应字符在 ransomNote 中的个数,如果没有小于 0 的,就返回 true,如果有,返回 false 。
解题
public boolean canConstruct(String ransomNote, String magazine) {
int offset = (int)'a';
char[] sourceCharArr = magazine.toCharArray();
char[] targetCharArr = ransomNote.toCharArray();
int[] charCount = new int[26];
for(int i=0;i<sourceCharArr.length;i++){
int charIndex = (int)sourceCharArr[i];
charCount[charIndex-offset]++;
}
for(int i=0;i<targetCharArr.length;i++){
int charIndex = (int)targetCharArr[i];
charCount[charIndex-offset]--;
}
for(int i=0;i<charCount.length;i++){
if(charCount[i]<0){
return false;
}
}
return true;
}